package com.atguigu.srb.core.controller.admin;


import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.atguigu.guigu.common.exception.BusinessException;
import com.atguigu.guigu.common.result.R;
import com.atguigu.guigu.common.result.ResultCodeEnum;
import com.atguigu.srb.core.pojo.entity.Dict;
import com.atguigu.srb.core.pojo.entity.excel.DictData;
import com.atguigu.srb.core.service.DictService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 数据字典 前端控制器
 * </p>
 *
 * @author Atguigu
 * @since 2022-11-19
 */
@Api(tags = "数据字典后台管理")
@RestController

@RequestMapping("/admin/core/dict")
public class AdminDictController {
    /*
        GET方式和POST的区别
            get没有请求体
            浏览器提交请求时为了保证不会出现数据丢失，默认会对请求报文的首行 头数据使用URLEncode编码
            服务器接收请求后自动使用URLDecode解码
                如果使用请求体以外的报文提交文件 浏览器编码后文件数据就丢失了
            post可以用来提交文件
     */

    @Autowired
    DictService dictService;
    @ApiOperation(value = "更新数据字典")
    @PutMapping("updateDict")
    public R updateDict(@RequestBody Dict dict){
        dictService.updateDict(dict);
        return R.ok();
    }

    @ApiOperation(value="根据父id查询数据字典集合")
    @GetMapping("getDictsByPid/{parentId}")
    public R getDictsByPid(@PathVariable("parentId")String parentId){
        List<Dict> dicts = dictService.getDictsByPid(parentId);
        return R.ok().data("items",dicts);
    }

    //前端提交一个数据字典的excel文件
    @ApiOperation(value = "批量导入数据字典")
    @PostMapping("import")
    public R importDicts(MultipartFile excel) {//excel代表前端提交文件的表单项的name值
        dictService.importDicts(excel);
        return R.ok();
    }

    @ApiOperation("导出数据字典")
    @GetMapping("export")
    public void exportDicts(HttpServletResponse response) {
        try {
            //处理下载数据字典excel文件的请求
            //1、查询所有的数据字典
            List<Dict> dicts = dictService.list();
            //2、将数据字典集合转为 DictData的集合
//        List<DictData> dictDatas = new ArrayList<>();
//        dicts.forEach(dict->{
//            DictData dictData = new DictData();
//            dictData.setId(dict.getId().toString());
//            dictData.setCode(dict.getDictCode());
//            dictData.setName(dict.getName());
//            dictData.setParentId(dict.getParentId().toString());
//            dictData.setValue(dict.getValue()==null?null:dict.getValue().toString());
//            dictDatas.add(dictData);
//        });
            //stream()将集合转为stream流   map：可以自动对集合进行遍历然后返回一个值
            //collect(Collectors.toList())将map()返回的值的集合 转为List集合
//        dicts.stream().map().collect(Collectors.toList());
            List<DictData> dictDatas = dicts.stream().map(dict -> {
                DictData dictData = new DictData();
                dictData.setId(dict.getId().toString());
                dictData.setCode(dict.getDictCode());
                dictData.setName(dict.getName());
                dictData.setParentId(dict.getParentId().toString());
                dictData.setValue(dict.getValue() == null ? null : dict.getValue().toString());
                return dictData;
            }).collect(Collectors.toList());
            //Joda包生成年月日时分秒的字符串
            //3、设置响应体内容的 格式和文件名称
            response.setHeader("Content-disposition" ,
                    "attachment;filename=dicts"+
                            new DateTime().toString("_yyyy_MM_dd_HH_mm")
                            + ExcelTypeEnum.XLSX.getValue());
            //4、将DictData集合 写入到excel文件中
            //获取响应报文的输出流：可以通过输出流写数据或文件到响应体中
            EasyExcel.write(response.getOutputStream())
                    .head(DictData.class)
                    .sheet("数据字典")
                    .doWrite(dictDatas);
        } catch (Exception e) {
//            e.printStackTrace();
            throw new BusinessException(ResultCodeEnum.EXPORT_DATA_ERROR ,e);
        }

        //4、将excel文件响应给浏览器

    }
}

